/**
 * 边界符
 */

//  1、^和$
// ^表示以什么字符开始，&表示以什么字符结束
// 当^写在[]里面，表示取反，注意区分
// 这两个符号的结合表示精确匹配，正则的值是什么，匹配的值就是什么
var reg1 = /123/; // 只要字符在任何位置存在123的字符串,就匹配成功
var reg2 = /^123/ // 开头必须是123的字符串,就匹配成功
var reg3 = /123$/ // 结尾必须是123的字符串,就匹配成功
var reg4 = /^123$/ // 精确匹配，字符值必须是123,就匹配成功

// console.log(reg1.test('fsdfs123wdqwe')) // true
// console.log(reg2.test('123sfsdgd')) // true
// console.log(reg3.test('dsdgdfgd123')) // true
// console.log(reg4.test('123123')) // false

// 2、[]
// 只要字符串包含[]中的“任何一个”字符，就匹配成功
var reg5 = /[abc]/;
console.log(reg5.test('a123123')) // true
console.log(reg5.test('b')) // true
console.log(reg5.test('c')) // true

var reg6 = /^[abc]$/; // 表示字符“包含”abc中的一个，就匹配成功
console.log(reg6.test('a')) // true
console.log(reg6.test('aa')) // false
console.log(reg6.test('abc')) // false

// 3、[-]表示范围
var reg7 = /^[a-z]$/; // 表示字符“必须是”a到z中的任意一个值，就匹配成功
console.log(reg7.test('g')) // true
console.log(reg7.test('az')) // false


// 4、字符组合
// 例如 [a-zA-Z0-9] // 表示字符只要包含a-z，A-Z, 0-9中的一个，就匹配成功
var reg8 = /^[a-zA-Z0-9]$/;
console.log(reg8.test('S')) // true
console.log(reg8.test('9')) // true
console.log(reg8.test('!')) // fase
console.log(reg8.test('12')) // fase

// 5、取反 [^]
var reg9 = /^[^a-zA-Z0-9]$/; // 表示字符串的值，不能是a-z，A-Z, 0-9中的一个，就匹配成功
console.log('reg9reg9reg9reg9reg9')
console.log(reg9.test('9')) // fase
console.log(reg9.test(';;.;.;.;.;')) // false

/**
 * 6、量词符
 * *     重复0次或者多次
 * +     重复一次或者多次
 * ?     重复零次或者一次
 * {n}   重复n次
 * {n,}  重复n次或更多次
 * {n,m} 重复n到m次, 注意，中间不要有空格
 */

var reg10 = /^a*$/;
console.log(reg10.test('')) // true
console.log(reg10.test('a')) // true
console.log(reg10.test('aa')) // true

var reg11 = /^a{3,}$/;
console.log(reg11.test('aa')) // false
console.log(reg11.test('aaa')) // true
console.log(reg11.test('aaaa')) // true

// 实现一个只要输出字母，数字，下划线_和中划线-,长度为6-16的正则
var reg12 = /^[a-zA-Z0-9_-]{6,16}$/;
console.log(reg12.test('_adasd-')) 

/**
 * 7、或和与
 *  | 表示或
 *  & 表示与
 */

/**
 * 括号总结
 * 中括号[]
 *   字符集合，匹配方括号中的任意字符
 * 大括号{}
 *    量词符，里面表示重复数
 * 小括号()
 *    表示优先级
 */


/** 
 * 8、预定义类
 * \d  匹配0-9之间的任意数字，相当于[0-9]
 * \D  匹配所有0-9意外的字符，相当于[^0-9]
 * \w  匹配任意字母、数字和下划线_，相当于[A-Za-z0-9]
 * \W  除匹配任意字母、数字和下划线_，相当于[^A-Za-z0-9]
 * \s  匹配空格（包括换行符，制表符，空格符等），相当于[\t\r\n\v\f]
 * \S  匹配非空格的字符，相当于[^\t\r\n\v\f]
 * .   匹配除\n的所有字符，相当于[^\n]
 * 
 * 大写的字母一般是取反
 */

// 实现一个座机号验证，全国座机号有两种格式：010-12345678  0530-1234567
var reg13 = /^\d{3}-\d{8}|\d{4}-\d{7}$/
// var reg13 = /^\d{3,4}-\d{7,8}$/
console.log(reg13.test('010-12345678'))
console.log(reg13.test('0530-1234567'))

/** 
 * 9、替换
 * replace(arg1, arg2)
 * arg1：被替换的字符串，或者是匹配的正则表达式
 * arg2替换成的值
 */
var str = "{{}}adads{{}}"
var newStr = str.replace(/{{}}/, "<>")
console.log(newStr) // <>adads{{}}

/**
 * 10、正则表达式的参数
 * g: 全局匹配，只要任何位置都出现，就会替换掉
 * i: 忽略大小写
 * gi: 全局匹配，并忽略大小写
 */

var str = "{{}}adads{{}}"
var newStr = str.replace(/{{}}/g, "<>")
console.log(newStr) // <>adads<>